/*Copyright (C) 2009 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/

///////////////////////////////////////////////////////////
/// \file Network.h Ce fichier procure des fonctions, types 
/// et enumération pour le réseau. Elle s'aide notamment 
/// des fichiers UDP.h pour les sockets UDP, TCP.h pour 
/// les sockets TCP et Error.h pour traiter les erreurs réseaux.
///////////////////////////////////////////////////////////

#ifndef CSLP_NETWORK_HEADER
# define CSLP_NETWORK_HEADER

# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */

# include "dll.h"

# ifdef WIN32
#  include <winsock2.h>
#  undef ERROR
#  define MSG_NOSIGNAL 0
	
  ///////////////////////////////////////////////////
  /// Définition interne
  ///////////////////////////////////////////////////
  typedef int socklen_t;
	
  ///////////////////////////////////////////////////
  /// Définition des sockets TCP
  ///////////////////////////////////////////////////
  typedef SOCKET CSLP_UDPSOCKET;

  ///////////////////////////////////////////////////
  /// Définition des sockets UDP
  ///////////////////////////////////////////////////
  typedef SOCKET CSLP_TCPSOCKET;
	
  void InitWSA();
  void CloseWSA();
	
# else /* WIN32 */
#  include <unistd.h>
#  include <sys/socket.h>
#  include <netinet/in.h>
#  include <arpa/inet.h>

  ///////////////////////////////////////////////////
  /// Définition interne
  ///////////////////////////////////////////////////
  typedef struct sockaddr_in SOCKADDR_IN;

  ///////////////////////////////////////////////////
  /// Définition interne
  ///////////////////////////////////////////////////
  typedef struct sockaddr SOCKADDR;

  ///////////////////////////////////////////////////
  /// Définition des sockets TCP
  ///////////////////////////////////////////////////
  typedef int CSLP_UDPSOCKET;

  ///////////////////////////////////////////////////
  /// Définition des sockets UDP
  ///////////////////////////////////////////////////
  typedef int CSLP_TCPSOCKET;
# endif /* !WIN32 */

  ///////////////////////////////////////////////////////////
  /// Définie le nombre de caractères maximal que contient une IP sous
  /// forme de chaine de caractères au format "xxx.xxx.xxx.xxx\0"
  ///////////////////////////////////////////////////////////
# define CSLP_MAX_IP_LENGHT 16

  ///////////////////////////////////////////////////////////
  /// Définie la valeur d'un socket invalide (code d'erreur).
  ///////////////////////////////////////////////////////////
# define CSLP_INVALID_SOCKET -1

  ///////////////////////////////////////////////////////////
  /// Enumération décrivant l'état d'erreur du socket après une oppération
  ///////////////////////////////////////////////////////////
  typedef enum CSLP_NETWORK_ERROR {
    ERROR,
    NONE,
    DISCONNECTED
  } CSLP_NETWORK_ERROR;



  ///////////////////////////////////////////////////////////
  /// Permet de convetir une IP sous forme d'entier au format big endian
  /// en une chaine de caractère.
  ///
  /// \param IP L'addresse IP au format big endian à convertire en chaine.
  /// \return Un pointeur alloué par le noyau ou WSA sur la chaine de caratère
  /// correspondant à l'IP passée en paramètre.
  /// \return NULL en cas d'erreur.
  ///////////////////////////////////////////////////////////
  char DLL_IMPEXP * CSLP_ULongIPToString(unsigned long IP);

  ///////////////////////////////////////////////////////////
  /// Permet de convertire une IP sous forme de chaine de caractère 
  /// en un entier au format big endian.
  ///
  /// \param IP L'adresse IP à convertir en entier.
  /// \return Un entier au format big endian correspondant à 
  /// l'adresse IP passée en paramètre.
  ///////////////////////////////////////////////////////////
  unsigned long DLL_IMPEXP CSLP_StringIPToULong(const char* IP);

  ///////////////////////////////////////////////////////////
  /// Permet de convertir un entier au format "big endian"
  ///
  /// \param uLong L'entier à convertir
  /// \return uLong au format big endian
  ///////////////////////////////////////////////////////////
  unsigned long DLL_IMPEXP CSLP_ULongToBigEndian(unsigned long uLong);

# ifdef __cplusplus
}
# endif /* __cplusplus */

#endif /* !CSLP_NETWORK_HEADER */

